package dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;

import bean.GebruikerBean;
import db.DBManager;
import exceptions.GebruikerBestaatAlException;
import exceptions.GebruikerBestaatNietException;

/**
 *  Dao voor de gebruiker table
 *
 */

public class GebruikerDao
{
	private DBManager manager;

	private String getGebruikerPrepare = "SELECT * FROM gebruikers WHERE email = ?";
	private String getGebruikersPrepare = "SELECT * FROM gebruikers";
	private String addGebruikerPrepare = "INSERT INTO gebruikers (gnaam,adres,email,wachtwoord,geboortedatum) VALUES(?,?,?,?,?)";
	private String delGebruikerPrepare = "DELETE FROM gebruikers WHERE g_id = ?";
	private String inlogGebruikerPrepare = "SELECT * FROM gebruikers WHERE email = ? AND wachtwoord = ? ";
	private String getGebruikerIdPrepare = "SELECT * FROM gebruikers WHERE g_id = ?";
	private PreparedStatement getGebruiker, addGebruiker, delGebruiker, getGebruikers, inlogGebruiker, getGebruikerId;

	public GebruikerDao(DBManager manager)
	{
		this.manager = manager;
		try
		{
			getGebruiker = manager.getConnection().prepareStatement(getGebruikerPrepare);
			addGebruiker = manager.getConnection().prepareStatement(addGebruikerPrepare);
			delGebruiker = manager.getConnection().prepareStatement(delGebruikerPrepare);
			getGebruikers = manager.getConnection().prepareStatement(getGebruikersPrepare);
			inlogGebruiker = manager.getConnection().prepareStatement(inlogGebruikerPrepare);
			getGebruikerId = manager.getConnection().prepareStatement(getGebruikerIdPrepare);
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
	}

	public GebruikerBean getGebruikerId(int id) throws GebruikerBestaatNietException
	{
		GebruikerBean gebruiker = null;
		try
		{
			getGebruikerId.setInt(1, id);
			ResultSet set = getGebruikerId.executeQuery();
			if (set.next())
			{
				gebruiker = new GebruikerBean(set.getInt("g_id"), set.getString("gnaam"), set.getString("adres"),
						set.getString("email"), set.getString("geboortedatum"), set.getString("wachtwoord"));
				return gebruiker;
			} else
			{
				throw new GebruikerBestaatNietException();
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		return gebruiker;
	}

	public GebruikerBean logIn(String mail, String password) throws GebruikerBestaatNietException
	{
		GebruikerBean gebruiker = null;

		try
		{
			inlogGebruiker.setString(1, mail);
			inlogGebruiker.setString(2, password);

			ResultSet set = inlogGebruiker.executeQuery();

			if (set.next())
			{
				gebruiker = new GebruikerBean(set.getInt("g_id"), set.getString("gnaam"), set.getString("adres"),
						set.getString("email"), set.getString("geboortedatum"), set.getString("wachtwoord"));
			} else
			{
				throw new GebruikerBestaatNietException();
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		return gebruiker;
	}

	public ArrayList<GebruikerBean> getGebruikers() throws GebruikerBestaatNietException
	{
		ArrayList<GebruikerBean> gebruikers = new ArrayList<GebruikerBean>();
		try
		{
			ResultSet set = getGebruikers.executeQuery();
			while (set.next())
			{
				GebruikerBean gebruiker = new GebruikerBean(set.getInt("g_id"), set.getString("gnaam"),
						set.getString("adres"), set.getString("email"), set.getString("geboortedatum"),
						set.getString("wachtwoord"));
				gebruikers.add(gebruiker);
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		return gebruikers;
	}

	public GebruikerBean getGebruiker(String email) throws GebruikerBestaatNietException
	{
		GebruikerBean gebruiker = null;
		try
		{
			getGebruiker.setString(1, email);
			ResultSet set = getGebruiker.executeQuery();
			if (set.next())
			{
				gebruiker = new GebruikerBean(set.getInt("g_id"), set.getString("gnaam"), set.getString("adres"),
						set.getString("email"), set.getString("geboortedatum"), set.getString("wachtwoord"));
				return gebruiker;
			} else
			{
				throw new GebruikerBestaatNietException();
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		return gebruiker;
	}

	public void addGebruiker(String naam, String adres, String geboortedatum, String email, String wachtwoord)
			throws GebruikerBestaatAlException
	{
		try
		{
			addGebruiker.setString(1, naam);
			addGebruiker.setString(2, adres);
			addGebruiker.setString(3, email);
			addGebruiker.setString(4, wachtwoord);
			addGebruiker.setString(5, geboortedatum);
			addGebruiker.execute();
		} catch (SQLIntegrityConstraintViolationException e)
		{
			throw new GebruikerBestaatAlException();
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
	}

	public void deleteGebruiker(int id)
	{
		try
		{
			delGebruiker.setInt(1, id);
			delGebruiker.execute();
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
	}

}
